/*******************************************
  Jose Andres Lara Vecino

  Author       : $$Author: cainlara@gmail.com $$
  Last CheckIn : $$Date: 2012-10-29 19:04:52 +0000 (Mon, 29 Oct 2012) $$
  Revision     : $$Revision: 108 $$
*******************************************/

package gui.suites.arbol;

import java.util.List;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;

import api.ISuiteAPI;
import control.App;
import frente.Suite;

/**
 * Modelo del arbol de suites.
 * 
 * @author jose.lara 06.06.2012
 */
public class SuitesArbolModel extends DefaultTreeModel {
    private static final long serialVersionUID = 2181125711837364112L;
    
    private ISuiteAPI api           = null;
    private List<Suite> todas       = null;

    public SuitesArbolModel(TreeNode root) {
        super(root);
        llenarArbol();
    }
    
    private ISuiteAPI getApi() {
        if(api == null) {
            api = App.getSesion().getSuiteAPI();
        }
        
        return api;
    }
    
    private List<Suite> getTodas() {
        if(todas == null) {
            todas = getApi().getTodasSuites();
        }
        
        return todas;
    }
    
    private void llenarArbol() {
        DefaultMutableTreeNode nodoPadre    = null;
        DefaultMutableTreeNode nodoHijo     = null;
        List<Suite> suites                  = null;
        
        suites = getTodas();
        
        if(suites != null) {
            for(Suite suite : suites) {
                nodoHijo = crearNodo(suite);
                nodoPadre = buscarNodo(suite.getIdPadre(), null);
                
                if(nodoPadre != null) {
                    insertNodeInto(nodoHijo, nodoPadre, 0);
                }
            }
        }
    }
    
    private static DefaultMutableTreeNode crearNodo(Suite suite) {
        DefaultMutableTreeNode nodo = null;
        
        if(suite != null) {
            nodo = new DefaultMutableTreeNode();
            nodo.setUserObject(suite);
        }
        
        return nodo;
    }
    
    private DefaultMutableTreeNode buscarNodo(final Long suiteId, DefaultMutableTreeNode nodoRaiz) {
        DefaultMutableTreeNode nodoHijo     = null;
        Suite suiteHijo                     = null;
        
        if(nodoRaiz == null) {
            nodoRaiz = (DefaultMutableTreeNode) getRoot();
        }
        
        if(suiteId != null) {
            for(int indice = 0; indice < nodoRaiz.getChildCount(); indice++) {
                nodoHijo = (DefaultMutableTreeNode) getChild(nodoRaiz, indice);
                
                suiteHijo = (Suite) nodoHijo.getUserObject();
                
                if(suiteHijo.getId() != null && suiteHijo.getId().longValue() == suiteId.longValue()) {
                    break;
                }
                
                nodoHijo = buscarNodo(suiteId, nodoHijo);
            }
        }
        else {
            nodoHijo = nodoRaiz;
        }
        
        return nodoHijo;
    }
}